function parseHTML(html, options) {

    while (html) {

        // 寻找 < 的起始位置，但是 < 不代表是 标签位置，可能是文字，所以下面要做相关处理
        var textEnd = html.indexOf('<'),
            text ,rest ,next;

        // 模板起始位置 是 标签
        if (textEnd === 0) {

            // html = '</div>'  匹配出 endTagMatch =["</div>", "div"]
            var endTagMatch = html.match(endTag);

            if (endTagMatch) {
                // endTagMatch[0]="</a>"
                html = html.substring(endTagMatch[0].length);
                options.end();
                continue
            }

            // Start tag: 不断匹配属性，截断 template
            // html = '<div></div>',startTagMatch = {tagName: "div", attrs: []}
            var startTagMatch = parseStartTag();
            
            // 匹配到 起始标签之后
            if (startTagMatch) {
                options.start(起始标签的信息);
                continue
            }
        }

        // 模板起始位置 不是 <，而是文字
        if (textEnd >= 0) {

            rest = html.slice(textEnd);

            /***
             * 处理文字中包含 < 的情况
             * 一直循环，直到文字被全部拿到，开头就是 结束标签或者起始标签
             */
            while ( rest开头不是结束标签，也不是起始标签) {

                // 避免文字中有 <
                // 从 1 位置开始 查找，因为 第0 个 是 < 符号
                next = rest.indexOf('<', 1);
                
                // 如果
                if (next < 0) break

                // 加长文字的长度
                textEnd += next;

                // 截取到正确的模板
                rest = html.slice(textEnd);
            }

            text = html.substring(0, textEnd);
            html = html.substring(n);
        }

        // 模板中没有内容了
        if (textEnd < 0) {
            console.log('textEnd--->',textEnd,html);
            text = html;
            html = '';
        }

        if (options.chars && text) {
            options.chars(text);
        }
    } 
}